﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpModelInterface.h"

namespace gcmp 
{ 
    struct NdbDatabaseOpenCallbacks;

    /// \brief 文件加载标记选项
    struct GCMP_MODEL_INTERFACE_EXPORT DocumentLoadOptions
    {
        bool Restore;                            ///< 如果上次异常退出，是否恢复，默认不恢复。

        bool ShouldSaveToAnotherFilePath;        ///< 打开文档时的场景判断，该文档是否需要按新路径保存。
                                                 ///< 如果是true，表示需要按新路径保存，如从模板新建，或族管理器编辑状态；
                                                 ///< 如果是false，表示不需要按新路径保存，如打开一般文档。

        bool ReadOnly;                           ///< 表示文档是否可保存、另存为、导出、备份等。
                                                 ///< true表示不可保存、另存为、导出、备份等。
                                                 ///< false表示可以保存、另存为、导出、备份等。

        bool InterProfessional;                 ///< 文档加载方式。true表示跨专业加载，false表示同专业加载

        bool OpenByModule;                      ///< 跨专业加载时，按照模块打开，未加载模块使用骨架数据。只有InterProfessional为true时才有效

        bool TakeOwnershipAfterLoaded;          ///< 是否在加载后，获取所有权。默认为true，但文件属于另外一个文档时，应该使用false。
                                                ///< 比如打开另外一个打开的文档中的族文件时，用false。

        bool Import;                            ///< 是否在导入一个文件;

        UInt16 DatasetSubId;                    ///< 工作单元项目内编号,在协同工作单元初次打开时，如果从本地样板文件打开，则需要提供该DatasetId；否则使用默认值即可

        std::wstring OwnerDatasetId;            ///< 所属工作单元Id。打开工作单元时，需要传入此选线。

        bool NeedHandleLinkedModel = true;      ///< 是否需要处理被链接的模型

        bool OpenDocWithUnrecognizableElements; ///< 当遇到不认识的element的时候继续打开文档，并将不认识的element读取为IncompleteElement

        NdbDatabaseOpenCallbacks* DbOpenCallbacks = nullptr; ///< Db打开回调

        bool Link = false;                      ///< 链接

        bool IsDataDocument = false;            ///< 是否按照数据文档模式加载

        std::wstring LocalFileFullPath = L"";   ///< 当属于单机版协同时，记录单机版文件的路径

        bool LinkUsingLatestVersion = false;    ///< 链接时使用数据源最新的版本

        bool NewFromTemlpate = false;           ///< 是否从模板文件新建文档

        bool LoadLinkElementProxyForLinkDataset = true; ///< 嵌套链接情况下是否加载链接工作单元内的链接数据，仅对协同同专业链接生效

        /// \brief 构造DocumentLoadOptions
        ///
        /// \param restore    如果上次异常退出，是否恢复，默认不恢复。
        /// \param shouldSaveToAnotherFilePath  打开文档时的场景判断，该文档是否需要按新路径保存。如果是true，表示需要按新路径保存，如从模板新建，或族管理器编辑状态；如果是false，表示不需要按新路径保存，如打开一般文档。
        /// \param readOnly    表示文档是否可保存、另存为、导出、备份等。true表示不可保存、另存为、导出、备份等。false表示可以保存、另存为、导出、备份等。
        /// \param interProfessional    文档加载方式。true表示跨专业加载，false表示同专业加载
        DocumentLoadOptions(
            bool restore,
            bool shouldSaveToAnotherFilePath,
            bool readOnly,
            bool interProfessional,
            bool openByModule = false,
            bool import = false,
            UInt16 datasetSubId = (std::numeric_limits<UInt16>::max)(),
            const std::wstring& ownerDatasetId = L"",
            bool needHandleLinkedModel = true,
            bool openDocWithUnrecognizableElements = false,
            NdbDatabaseOpenCallbacks* dbOpenCallbacks = nullptr,
            bool link = false,
            bool isDataDocument = false,
            const std::wstring& localFileFullPath = L"",
            bool linkUsingLatestVersion = false,
            bool newFromTemlpate = false,
            bool loadLinkElementProxy = true
        )
            : TakeOwnershipAfterLoaded(true)
            , Restore(restore)
            , ShouldSaveToAnotherFilePath(shouldSaveToAnotherFilePath)
            , ReadOnly(readOnly)
            , InterProfessional(interProfessional)
            , OpenByModule(openByModule)
            , Import(import)
            , DatasetSubId(datasetSubId)
            , OwnerDatasetId(ownerDatasetId)
            , NeedHandleLinkedModel(needHandleLinkedModel)
            , OpenDocWithUnrecognizableElements(openDocWithUnrecognizableElements)
            , DbOpenCallbacks(dbOpenCallbacks)
            , Link(link)
            , IsDataDocument(isDataDocument)
            , LocalFileFullPath(localFileFullPath)
            , LinkUsingLatestVersion(linkUsingLatestVersion)
            , NewFromTemlpate(newFromTemlpate)
            , LoadLinkElementProxyForLinkDataset(loadLinkElementProxy)
        {
        }
    };
}// namespace gcmp
